package net.suncaper.mvc.utils;

import net.suncaper.mvc.exception.BusinessException;
import net.suncaper.mvc.service.IPermissionService;
import net.suncaper.mvc.service.IRoleService;
import net.suncaper.mvc.service.impl.PermissionServiceImpl;
import net.suncaper.mvc.service.impl.RoleServiceImpl;

/**
 * 鉴权工具类
 */
public class AuthorizationUtil {
    
    private static final IRoleService roleService = new RoleServiceImpl();
    private static final IPermissionService permissionService = new PermissionServiceImpl();
    
    private AuthorizationUtil() {
        // 私有构造函数，防止实例化
    }
    
    /**
     * 检查用户是否有指定角色
     *
     * @param userId 用户ID
     * @param roleName 角色名称
     * @return 用户是否有指定角色
     */
    public static boolean hasRole(String userId, String roleName) {
        return roleService.hasRole(userId, roleName);
    }
    
    /**
     * 检查用户是否有指定权限
     *
     * @param userId 用户ID
     * @param permissionName 权限名称
     * @return 用户是否有指定权限
     */
    public static boolean hasPermission(String userId, String permissionName) {
        return permissionService.hasPermission(userId, permissionName);
    }
    
    /**
     * 要求用户必须有指定角色，否则抛出异常
     *
     * @param userId 用户ID
     * @param roleName 角色名称
     * @throws BusinessException 如果用户没有指定角色
     */
    public static void requireRole(String userId, String roleName) throws BusinessException {
        if (!hasRole(userId, roleName)) {
            throw new BusinessException("当前用户没有" + roleName + "角色，无法执行此操作");
        }
    }
    
    /**
     * 要求用户必须有指定权限，否则抛出异常
     *
     * @param userId 用户ID
     * @param permissionName 权限名称
     * @throws BusinessException 如果用户没有指定权限
     */
    public static void requirePermission(String userId, String permissionName) throws BusinessException {
        if (!hasPermission(userId, permissionName)) {
            throw new BusinessException("当前用户没有" + permissionName + "权限，无法执行此操作");
        }
    }
    
    /**
     * 检查用户是否是客户
     *
     * @param userId 用户ID
     * @return 用户是否是客户
     */
    public static boolean isCustomer(String userId) {
        return hasRole(userId, "客户");
    }
    
    /**
     * 检查用户是否是酒店商家
     *
     * @param userId 用户ID
     * @return 用户是否是酒店商家
     */
    public static boolean isHotelOwner(String userId) {
        return hasRole(userId, "酒店商家");
    }
    
    /**
     * 检查用户是否是管理员
     *
     * @param userId 用户ID
     * @return 用户是否是管理员
     */
    public static boolean isAdmin(String userId) {
        return hasRole(userId, "管理员");
    }
} 